package com.itjin.health.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itjin.health.domain.dto.InjuryReportAddRequest;
import com.itjin.health.domain.dto.InjuryReportUpdateRequest;
import com.itjin.health.domain.entity.InjuryReport;
import com.itjin.health.domain.vo.InjuryReportVO;
import com.itjin.health.domain.vo.InjuryReportDetailVO;

/**
 * 伤病报告服务接口
 */
public interface InjuryReportService {

  /**
   * 添加伤病报告
   *
   * @param injuryReportAddRequest 添加伤病报告请求
   * @param userId                 用户ID
   * @return 伤病报告ID
   */
  Integer addInjuryReport(InjuryReportAddRequest injuryReportAddRequest, Integer userId);

  /**
   * 更新伤病报告
   *
   * @param injuryReportUpdateRequest 更新伤病报告请求
   * @param userId                    用户ID
   * @return 更新结果
   */
  boolean updateInjuryReport(InjuryReportUpdateRequest injuryReportUpdateRequest, Integer userId);

  /**
   * 删除伤病报告
   *
   * @param id     伤病报告ID
   * @param userId 用户ID
   * @return 删除结果
   */
  boolean deleteInjuryReport(Integer id, Integer userId);

  /**
   * 获取伤病报告详情
   *
   * @param id 伤病报告ID
   * @return 伤病报告详情
   */
  InjuryReportVO getInjuryReportById(Integer id);

  /**
   * 获取伤病报告详情（包含预约信息）
   *
   * @param id 伤病报告ID
   * @return 伤病报告详情（包含预约信息）
   */
  InjuryReportDetailVO getInjuryReportDetail(Integer id);

  /**
   * 分页获取用户的伤病报告列表
   *
   * @param userId  用户ID
   * @param current 当前页
   * @param size    每页大小
   * @return 伤病报告列表
   */
  Page<InjuryReportVO> listUserInjuryReports(Integer userId, long current, long size);

  /**
   * 分页获取所有伤病报告列表（管理员和教师用）
   *
   * @param current   当前页
   * @param size      每页大小
   * @param keyword   关键词搜索（可选）
   * @param startDate 开始日期（可选）
   * @param endDate   结束日期（可选）
   * @param severity  严重程度（可选，枚举：轻微、中等、严重）
   * @param status    状态（可选，枚举：新提交、处理中、已解决、关闭）
   * @return 伤病报告列表
   */
  Page<InjuryReportVO> listAllInjuryReports(long current, long size, String keyword,
      String startDate, String endDate, String severity, String status);

  /**
   * 添加诊断和治疗建议（管理员和教师用）
   *
   * @param reportId  伤病报告ID
   * @param diagnosis 诊断结果
   * @param treatment 治疗建议
   * @param status    更新状态（枚举：处理中、已解决、关闭）
   * @param userId    操作用户ID
   * @return 更新结果
   */
  boolean addDiagnosisAndTreatment(Integer reportId, String diagnosis,
      String treatment, String status, Integer userId);

  /**
   * 获取伤病报告统计数据（管理员和教师用）
   *
   * @param startDate 开始日期（可选）
   * @param endDate   结束日期（可选）
   * @return 统计数据
   */
  Object getInjuryReportStats(String startDate, String endDate);

  /**
   * 批量导出伤病报告（管理员和教师用）
   *
   * @param ids       伤病报告ID列表（可选，为空则导出符合条件的所有）
   * @param startDate 开始日期（可选）
   * @param endDate   结束日期（可选）
   * @param severity  严重程度（可选，枚举：轻微、中等、严重）
   * @return 文件下载链接
   */
  String exportInjuryReports(String ids, String startDate, String endDate, String severity);

  /**
   * 将伤病报告实体转换为视图对象
   *
   * @param injuryReport 伤病报告实体
   * @return 伤病报告视图对象
   */
  InjuryReportVO getInjuryReportVO(InjuryReport injuryReport);
}